package com.zhengdongzulin.zuke.ext

import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Environment
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import com.luck.picture.lib.PictureSelector
import com.luck.picture.lib.camera.CustomCameraView
import com.luck.picture.lib.config.PictureConfig
import com.luck.picture.lib.config.PictureMimeType
import com.luck.picture.lib.entity.LocalMedia
import com.luck.picture.lib.listener.OnResultCallbackListener
import com.lxj.androidktx.core.*
import com.zhengdongzulin.zuke.R
import com.zhengdongzulin.zuke.app.data.ChangeHomeData
import com.zhengdongzulin.zuke.base.MyApp
import com.zhengdongzulin.zuke.picture.GlideEngine
import java.io.File

/**
 * 默认启动
 */
fun <T> Intent.start(context: Context, clazz: Class<T>) {
    this.setClass(context, clazz)
    this.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
    context.startActivity(this)
}

/**
 * 创建新的栈启动
 */
fun <T> Intent.start(clazz: Class<T>) {
    this.setClass(MyApp().getContext(), clazz)
    this.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    MyApp().getContext().startActivity(this)
}

/**
 * 默认启动
 */
fun Intent.put(key: String, value: String): Intent {
    this.putExtra(key, value)
    return this
}

/**
 * 默认启动
 */
fun Intent.put(key: String, value: Boolean): Intent {
    this.putExtra(key, value)
    return this
}

/**
 * remove掉activity
 * 注释掉的代码只是整理一个思路，并没卵用
 */
fun Activity.removeActivitys(vararg clazz: Class<*>) {
    val mActivitys = MyApp.mActivitys
    var removeCount = 0
    for (index in mActivitys.indices) {
        val activity = mActivitys[index - removeCount]
        for (cl in clazz) {
            if (activity.javaClass.name == cl.name) {
                activity.finish()
//                mActivitys.removeAt(index - removeCount)
//                removeCount++
            }
        }
    }
}

/**
 * 获取指定屏幕比例宽高的底部弹出dialog
 */
fun Activity.getBottomDialog(v: View, height: Double = 0.7): Dialog {
    var dialog = Dialog(this, R.style.BottomDialogTheme)

    dialog.setContentView(v)
    dialog.window?.apply {
        setGravity(Gravity.BOTTOM);
        setWindowAnimations(R.style.bottomDialogThemeAnim)
        setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
        if (height != 0.0) {
            var attr = attributes
            attr.height = (windowManager.defaultDisplay.height * height).toInt()
            attributes = attr
        }
    }
    return dialog
}

/**
 * 获取指定屏幕比例宽高的中间弹出dialog
 * 个人中心-切换房间
 */
fun Activity.getCenterDialog(
    list: MutableList<ChangeHomeData>,
    disimiss: (ChangeHomeData) -> Unit
): Dialog {

    val string = sp().getString("change_home", "")
    var selData: ChangeHomeData = Gson().fromJson(string, ChangeHomeData::class.java)
    var dialog = Dialog(this)
    val v = View.inflate(this, R.layout.dialog_change_home, null)
    val recyclerView = v.findViewById<RecyclerView>(R.id.recyclerView)
    recyclerView.vertical().bindData(list, R.layout.item_change_home) { holder, t, position ->
        holder.setText(R.id.name, t.houseName + "")
        holder.setText(R.id.address, t.houseNumber + "")
        holder.setText(R.id.time, "${t.startDate}/${t.endDate}")
        var content_view = holder.getView<View>(R.id.content_view)
        if (t.houseId == selData.houseId) {
            holder.setColor(R.id.name, R.color.color_1273f7)
            holder.setColor(R.id.address, R.color.color_1273f7)
            holder.setColor(R.id.time, R.color.color_1273f7)
            content_view.setBackgroundResource(R.drawable.change_home_sel_bg)
        } else {
            holder.setColor(R.id.name, R.color.gray_99)
            holder.setColor(R.id.address, R.color.gray_99)
            holder.setColor(R.id.time, R.color.gray_99)
            content_view.setBackgroundResource(R.drawable.change_home_bg)
        }
    }.itemClick { data: List<ChangeHomeData>, holder, position ->
        selData = data[position]
        recyclerView.adapter!!.notifyDataSetChanged()
    }
    v.findViewById<TextView>(R.id.ok).setOnClickListener {
        disimiss(selData)
        sp().putString("change_home", selData.toJson())
        dialog.dismiss()
    }
    dialog.setContentView(v)
    dialog.window?.apply {
        setGravity(Gravity.CENTER)
//        setWindowAnimations(R.style.bottomDialogThemeAnim)
        setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
        setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    }
    return dialog
}

/**
 *
 */
fun Activity.getDialog(title: String, desc: String, dismiss: () -> Unit): Dialog {
    var dialog = Dialog(this)
    val v = View.inflate(this, R.layout.dialog_main_hint, null)
    v.findViewById<TextView>(R.id.title).text = title
    v.findViewById<TextView>(R.id.desc).text = desc
    v.findViewById<TextView>(R.id.ok).setOnClickListener {
        dialog.dismiss()
        dismiss()
    }
    dialog.setContentView(v)
    dialog.window?.apply {
        setGravity(Gravity.CENTER);
        setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
        setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    }
    return dialog
}

/**
 * 联系管家
 */
fun Activity.callPhoneDialog(title: String, phone: String): Dialog {
    var dialog = Dialog(this)
    val v = View.inflate(this, R.layout.dialog_call_phone, null)
    v.findViewById<TextView>(R.id.title).text = "${title}"
    v.findViewById<TextView>(R.id.ok).setOnClickListener {
        dialog.dismiss()
        if (phone.isNullOrEmpty()) {
            toast("管理员电话为空")
            return@setOnClickListener
        }
        XXPermissions.with(this)
            .permission(Permission.CALL_PHONE)
            .request(object : OnPermissionCallback {
                override fun onGranted(
                    permissions: MutableList<String>?,
                    all: Boolean
                ) {
                    var intent = Intent(Intent.ACTION_DIAL);
                    var data = Uri.parse("tel:" + phone)
                    intent.setData(data);
                    startActivity(intent)
                }

                override fun onDenied(
                    permissions: MutableList<String>?,
                    never: Boolean
                ) {
                    if (never) {
                        toast("被永久拨打电话权限，请打开权限");
                        // 如果是被永久拒绝就跳转到应用权限系统设置页面
//                                    XXPermissions.startPermissionActivity(MainActivity.this, permissions);
                    } else {
                        toast("用户拒绝拨打电话权限");
                    }
                }

            })
    }
    dialog.setContentView(v)
    dialog.window?.apply {
        setGravity(Gravity.CENTER);
        setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
        setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    }
    return dialog
}

fun Activity.openSingleGallery(
    isEnableCrop: Boolean = false,
    listener: (isSuccess: Boolean, path: String) -> Unit
) {
    PictureSelector.create(this)
        .openGallery(PictureMimeType.ofImage())//相册 媒体类型 PictureMimeType.ofAll()、ofImage()、ofVideo()、ofAudio()、
        .theme(R.style.picture_default_style)
        .loadImageEngine(GlideEngine.createGlideEngine())
        .selectionMode(PictureConfig.SINGLE)//单选or多选 PictureConfig.SINGLE PictureConfig.MULTIPLE
        .isPageStrategy(true)//开启分页模式，默认开启另提供两个参数；pageSize每页总数；isFilterInvalidFile是否过滤损坏图片
        .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
        .isCamera(false)//列表是否显示拍照按钮
        .isZoomAnim(true)//图片选择缩放效果
        .isEnableCrop(isEnableCrop)//是否开启裁剪
        .freeStyleCropEnabled(true)//裁剪框是否可拖拽
        .rotateEnabled(false)//裁剪是否可旋转图片
        .scaleEnabled(true)//裁剪是否可放大缩小图片
        .hideBottomControls(true)//显示底部uCrop工具栏
        .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
        .isPreviewImage(true)//是否预览图片
        .hideBottomControls(true)//显示底部uCrop工具栏
        .isCompress(true)//是否压缩
        .compressQuality(70)//图片压缩后输出质量
        .synOrAsy(false)//开启同步or异步压缩
//        .querySpecifiedFormatSuffix(PictureMimeType.of())//只查询指定后缀的资源，PictureMimeType.ofJPEG() ...
        .isReturnEmpty(true)//未选择数据时按确定是否可以退出
        .setButtonFeatures(CustomCameraView.BUTTON_STATE_BOTH)// 自定义相机按钮状态,CustomCameraView.BUTTON_STATE_BOTH
        .isMaxSelectEnabledMask(true)//选择条件达到阀时列表是否启用蒙层效果
        .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
//        .openGallery()//相册 媒体类型 PictureMimeType.ofAll()、ofImage()、ofVideo()、ofAudio()
//        //.openCamera()//单独使用相机 媒体类型 PictureMimeType.ofImage()、ofVideo()
//        .theme()// xml样式配制 R.style.picture_default_style、picture_WeChat_style or 更多参考Demo
//        .imageEngine()// 图片加载引擎 需要 implements ImageEngine接口
//        .compressEngine() // 自定义图片压缩引擎
//        .selectionMode()//单选or多选 PictureConfig.SINGLE PictureConfig.MULTIPLE
//        .isPageStrategy()//开启分页模式，默认开启另提供两个参数；pageSize每页总数；isFilterInvalidFile是否过滤损坏图片
//        .isSingleDirectReturn()//PictureConfig.SINGLE模式下是否直接返回
//        .isWeChatStyle()//开启R.style.picture_WeChat_style样式
//        .setPictureStyle()//动态自定义相册主题
//        .setPictureCropStyle()//动态自定义裁剪主题
//        .setPictureWindowAnimationStyle()//相册启动退出动画
//        .isCamera()//列表是否显示拍照按钮
//        .isZoomAnim()//图片选择缩放效果
//        .imageFormat()//拍照图片格式后缀,默认jpeg, PictureMimeType.PNG，Android Q使用PictureMimeType.PNG_Q
//        .maxSelectNum()//最大选择数量,默认9张
//        .minSelectNum()// 最小选择数量
//        .maxVideoSelectNum()//视频最大选择数量
//        .minVideoSelectNum()//视频最小选择数量
//        .videoMaxSecond()// 查询多少秒以内的视频
//        .videoMinSecond()// 查询多少秒以内的视频
//        .imageSpanCount()//列表每行显示个数
//        .openClickSound()//是否开启点击声音
//        .selectionMedia()//是否传入已选图片
//        .recordVideoSecond()//录制视频秒数 默认60s
//        .filterMinFileSize() // 过滤最小的文件
//        .filterMaxFileSize() // 过滤最大的文件
//        .queryMimeTypeConditions(PictureMimeType.ofJPEG()) // 只查询什么类型的文件
//        .previewEggs()//预览图片时是否增强左右滑动图片体验
//        .cropCompressQuality()// 注：已废弃 改用cutOutQuality()
//        .isGif()//是否显示gif
//        .previewImage()//是否预览图片
//        .previewVideo()//是否预览视频
//        .enablePreviewAudio()//是否预览音频
//        .enableCrop()//是否开启裁剪
//        .cropWH()// 裁剪宽高比,已废弃，改用. cropImageWideHigh()方法
//        .cropImageWideHigh()// 裁剪宽高比，设置如果大于图片本身宽高则无效
//        .withAspectRatio()//裁剪比例
//        .cutOutQuality()// 裁剪输出质量 默认100
//        .freeStyleCropEnabled()//裁剪框是否可拖拽
//        .circleDimmedLayer()// 是否开启圆形裁剪
//        .setCircleDimmedColor()//设置圆形裁剪背景色值
//        .setCircleDimmedBorderColor()//设置圆形裁剪边框色值
//        .setCircleStrokeWidth()//设置圆形裁剪边框粗细
//        .showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
//        .showCropGrid()//是否显示裁剪矩形网格 圆形裁剪时建议设为false
//        .rotateEnabled()//裁剪是否可旋转图片
//        .scaleEnabled()//裁剪是否可放大缩小图片
//        .isDragFrame()//是否可拖动裁剪框(固定)
//        .hideBottomControls()//显示底部uCrop工具栏
//        .basicUCropConfig()//对外提供ucrop所有的配制项
//        .compress()//是否压缩
//        .compressEngine()// 自定义压缩引擎
//        .compressFocusAlpha()//压缩后是否保持图片的透明通道
//        .minimumCompressSize()// 小于多少kb的图片不压缩
//        .videoQuality()//视频录制质量 0 or 1
//        .compressQuality()//图片压缩后输出质量
//        .synOrAsy()//开启同步or异步压缩
//        .queryMaxFileSize()//查询指定大小内的图片、视频、音频大小，单位M
//        .compressSavePath()//自定义压缩图片保存地址，注意Q版本下的适配
//        .sizeMultiplier()//glide加载大小，已废弃
//        .glideOverride()//glide加载宽高，已废弃
//        .isMultipleSkipCrop()//多图裁剪是否支持跳过
//        .isMultipleRecyclerAnimation()// 多图裁剪底部列表显示动画效果
//        .querySpecifiedFormatSuffix()//只查询指定后缀的资源，PictureMimeType.ofJPEG() ...
//        .isReturnEmpty()//未选择数据时按确定是否可以退出
//        .isAndroidQTransform()//Android Q版本下是否需要拷贝文件至应用沙盒内
//        .setRequestedOrientation()//屏幕旋转方向 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED ...
//        .isOriginalImageControl()//开启原图选项
//        .bindCustomPlayVideoCallback()//自定义视频播放拦截
//        .bindCustomCameraInterfaceListener()//自定义拍照回调接口
//        .bindCustomPreviewCallback()// 自定义图片预览回调接口
//        .cameraFileName()//自定义拍照文件名，如果是相册内拍照则内部会自动拼上当前时间戳防止重复
//        .renameCompressFile()//自定义压缩文件名，多张压缩情况下内部会自动拼上当前时间戳防止重复
//        .renameCropFileName()//自定义裁剪文件名，多张裁剪情况下内部会自动拼上当前时间戳防止重复
//        .setRecyclerAnimationMode()//列表动画效果,AnimationType.ALPHA_IN_ANIMATION、SLIDE_IN_BOTTOM_ANIMATION
//        .isUseCustomCamera()// 开启自定义相机
//        .setButtonFeatures()// 自定义相机按钮状态,CustomCameraView.BUTTON_STATE_BOTH
//        .setLanguage()//国际化语言 LanguageConfig.CHINESE、ENGLISH、JAPAN等
//        .isWithVideoImage()//图片和视频是否可以同选,只在ofAll模式下有效
//        .isMaxSelectEnabledMask()//选择条件达到阀时列表是否启用蒙层效果
//        .isAutomaticTitleRecyclerTop()//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
//        .loadCacheResourcesCallback()//获取ImageEngine缓存图片，参考Demo
//        .setOutputCameraPath()// 自定义相机输出目录只针对Android Q以下版本，具体参考Demo
        .forResult(object : OnResultCallbackListener<LocalMedia> {
            override fun onResult(result: MutableList<LocalMedia>) {
                // 图片选择结果回
                if (result != null && result.size > 0) {
                    listener(true, result[0].getFilePath())
                }
            }

            override fun onCancel() {
                listener(false, "")
            }
        })
}

fun Activity.openGallery(
    selects: MutableList<LocalMedia>,
    listener: (isSuccess: Boolean, result: MutableList<LocalMedia>) -> Unit
) {
    PictureSelector.create(this)
        .openGallery(PictureMimeType.ofImage())//相册 媒体类型 PictureMimeType.ofAll()、ofImage()、ofVideo()、ofAudio()、
        .theme(R.style.picture_default_style)
        .loadImageEngine(GlideEngine.createGlideEngine())
        .selectionMode(PictureConfig.MULTIPLE)//单选or多选 PictureConfig.SINGLE PictureConfig.MULTIPLE
        .maxSelectNum(5)
        .isPageStrategy(true)//开启分页模式，默认开启另提供两个参数；pageSize每页总数；isFilterInvalidFile是否过滤损坏图片
        .isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
        .isCamera(false)//列表是否显示拍照按钮
        .isZoomAnim(true)//图片选择缩放效果
        .selectionData(selects)
        .isPreviewEggs(true)//预览图片时是否增强左右滑动图片体验
        .isPreviewImage(true)//是否预览图片
        .hideBottomControls(true)//显示底部uCrop工具栏
        .isCompress(true)//是否压缩
        .compressQuality(70)//图片压缩后输出质量
        .synOrAsy(false)//开启同步or异步压缩
//        .querySpecifiedFormatSuffix(PictureMimeType.of())//只查询指定后缀的资源，PictureMimeType.ofJPEG() ...
        .isReturnEmpty(true)//未选择数据时按确定是否可以退出
        .setButtonFeatures(CustomCameraView.BUTTON_STATE_BOTH)// 自定义相机按钮状态,CustomCameraView.BUTTON_STATE_BOTH
        .isMaxSelectEnabledMask(true)//选择条件达到阀时列表是否启用蒙层效果
        .isAutomaticTitleRecyclerTop(true)//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部

        .forResult(object : OnResultCallbackListener<LocalMedia> {
            override fun onResult(result: MutableList<LocalMedia>) {
                listener(true, result)

            }

            override fun onCancel() {
                listener(false, mutableListOf())
            }
        })
}

fun Activity.openCamera(listener: (isSuccess: Boolean, path: String) -> Unit) {
    PictureSelector.create(this)
        .openCamera(PictureMimeType.ofImage())
//        .loadImageEngine(GlideEngine.createGlideEngine())
        .forResult(object : OnResultCallbackListener<LocalMedia> {
            override fun onResult(result: MutableList<LocalMedia>) {
                // 图片选择结果回
                if (result != null && result.size > 0) {
                    val localMedia = result[0]
                    listener(true, localMedia.getFilePath())
                }
            }

            override fun onCancel() {
                listener(false, "")
            }
        })
}

fun LocalMedia.getFilePath(): String {
    var filePath = ""
    if (isCut && !cutPath.isNullOrEmpty()) {
        filePath = cutPath
    } else if (!androidQToPath.isNullOrEmpty()) {//Android Q版本特有返回的字段，此字段有值就用来做上传使用
        filePath = androidQToPath
    } else if (isCompressed && !compressPath.isNullOrEmpty()) {//为压缩后path，需判断media.isCompressed();是否为true
        filePath = compressPath
    } else if (isOriginal && !originalPath.isNullOrEmpty()) {//media.isOriginal());为true时此字段才有值
        filePath = originalPath
    } else if (!realPath.isNullOrEmpty()) {//真实路径
        filePath = realPath
    } else {//为原图path
        filePath = path
    }
    return filePath
}

fun Activity.createApkFile(): File? {
    val storageDir = this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
    if (!storageDir!!.exists()) {
        storageDir.mkdir()
    }
    return File.createTempFile("ydshangpin", ".apk", storageDir)
}